package com.smart.web.controller.user.bucket;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {

    public static List<Integer> recordMaxFluctuations(List<Integer> distances, double threshold) {
        List<Integer> maxFluctuations = new ArrayList<>();
        Integer currentMax = Integer.MIN_VALUE; // 初始化当前最大值为最小可能值
        boolean inFluctuation = false; // 标记是否处于波动中

        // 遍历数据点，计算相邻点之间的变化量
        for (int i = 1; i < distances.size(); i++) {
            double fluctuation = distances.get(i) - distances.get(i - 1);

            // 如果波动超过阈值，并且之前不在波动中，则开始新的波动
            if (fluctuation > threshold && !inFluctuation) {
                inFluctuation = true;
                currentMax = distances.get(i); // 更新当前最大值为当前数据点
            }

            // 如果处于波动中，并且当前数据点大于之前的最大值，则更新最大值
            if (inFluctuation && distances.get(i) > currentMax) {
                currentMax = distances.get(i);
            }

            // 如果波动结束（即数据点小于40），则记录当前最大值，并重置状态
            if (inFluctuation && distances.get(i) < 40) {
                maxFluctuations.add(currentMax);
                inFluctuation = false;
                currentMax = Integer.MIN_VALUE; // 重置当前最大值为最小可能值，为下一次波动做准备
            }
        }

        // 如果最后一个数据点是波动的一部分，并且没有小于40的后续数据点来结束波动
        // 我们需要检查是否应该将其视为一次波动的结束，并记录最大值
        if (inFluctuation) {
            maxFluctuations.add(currentMax);
        }

        return maxFluctuations;
    }

    public static void main(String[] args) throws InterruptedException {
        // 模拟数据流
        List<Integer> distances = Arrays.asList(new Integer[]{31, 31, 31, 115, 195, 317, 426, 439, 439, 382, 273, 142, 48, 31, 115, 195, 317, 426, 420, 430, 382, 273, 142, 48});
        double threshold = 10.0;

        List<Integer> currentDistances = new ArrayList<>();
        List<Integer> maxFluctuations = new ArrayList<>();

        for (Integer distance : distances) {
            currentDistances.add(distance);

            if (currentDistances.size() > 1) {
                maxFluctuations = recordMaxFluctuations(currentDistances, threshold);
                System.out.println("当前数据点: " + distance);
                System.out.println("每次波动的最大值: " + maxFluctuations);
                System.out.println("波动次数: " + maxFluctuations.size());
                System.out.println("-----------------------------------");
            }

            // 模拟每十秒钟读取一次数据点
            Thread.sleep(1000);
        }
    }
}
